[PB List表][Go SDK]遍历表数据

1. 接口说明

list表全表遍历

注意:

  • 调用 request的SetFieldName接口,填入需要的key字段和value字段,可以部分字段遍历。
  • 每个表同时只能有一个遍历器在运行,单个gamesvr同时最多支持8个遍历器,建议遍历器要少一点,否则对正常的读写访问时延有影响。
  • 同步接口会将遍历的数据放内存中,占用内存大;推荐使用异步,边遍历边处理响应

2. 版本要求

无特殊要求,所有版本都提供了该接口。

3. 准备工作

参见准备工作文档,完成使用该接口前的准备工作,并创建如下PB List表。tb_online_list

syntax = "proto3";                      // Specify the version of the protocol buffers language

package tcaplusservice;

import "tcaplusservice.optionv1.proto"; // Use the public definitions of TcaplusDB by importing them.

message tb_online_list {
        option(tcaplusservice.tcaplus_primary_key) = "openid,tconndid,timekey";
        option(tcaplusservice.tcaplus_customattr) = "TableType=LIST;ListNum=1023";

        int32 openid = 1; //QQ Uin
        int32 tconndid = 2;
        string timekey = 3;
        string gamesvrid = 4;
        int32 logintime = 5 ;
        repeated int64 lockid = 6;
        pay_info pay = 7;

        message pay_info {
        uint64 total_money = 1;
        uint64 pay_times = 2;
        }

        }

准备工作完成后,将会获得以下信息,这些信息在使用SDK时会被用到:

  1. 目录服务器地址列表
  2. 业务ID
  3. 业务访问密码
  4. 游戏区ID
  5. 数据表名

4. 示例代码

示例代码的基本执行过程:

  1. 定义表配置参数
  2. 设置日志配置;
  3. 创建客户端;
  4. 发送请求并处理响应;
  5. 销毁客户端。

客户端初始化示例:

package main

import (
  "fmt"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api"
)

// 定义表配置参数
const (
  AppId                = uint64(2)
  ZoneId               = uint32(3)
  DirUrl               = "tcp://x.x.x.x:xxxx"
  Signature            = "xxxxxxxxxxxxx"
  TableName            = "tb_online_list"
)

var client *tcaplus.PBClient

func main() {
  // 创建客户端
  client = tcaplus.NewPBClient()
  // 设置日志配置,logconf.xml文件设置了日志级别
  if err := client.SetLogCfg("./logconf.xml"); err != nil {
    fmt.Println(err.Error())
    return
  }

  //构造Map对象存储对应表格组下所有的表
  zoneList := []uint32{ZoneId}
  zoneTable := make(map[uint32][]string)
  zoneTable[ZoneId] = []string{TableName}

  // 连接TcaplusDB后端
  err := client.Dial(AppId, zoneList, DirUrl, Signature, 30, zoneTable)
  if err != nil {
    fmt.Printf("init failed %v\n", err.Error())
    return
  }
  // 设置默认使用的zone
  client.SetDefaultZoneId(ZoneId)
  fmt.Printf("Dial finish\n")
  ListTraverseExample()

  // 程序退出时调用Close销毁客户端
  client.Close()
}

4.1 同步调用示例

该示例同步调用方式比较类似C++接口的调用方式,需要创建请求和解析响应示例目录

package main

import (
  "fmt"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/example/PB/table/tcaplusservice"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/example/PB/tools"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/logger"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/terror"
  "time"
)

// 针对同一个表只能存在一个遍历器
// 同步请求的遍历只针对数据量较小的表,由于会把所有的数据存放在内存中,占用内存
// 数据量较大的表可以使用异步遍历,边遍历边处理数据
func ListTraverseExample() {
  // 获取遍历器,遍历器最多同时8个工作,如果超过会返回nil
  tra := client.GetListTraverser(tools.Zone, "tb_online_list")
  if tra == nil {
    logger.ERR("GetTraverser fail")
    return
  }
  // 调用stop才能释放资源,防止获取遍历器失败
  defer tra.Stop()
  // (非必须)限制本次遍历记录条数,默认不限制
  tra.SetLimit(1000)

  resps, err := client.DoTraverse(tra, 30*time.Second)
  if err != nil {
    fmt.Println(err.Error())
    return
  }

  for _, res := range resps {
    ret := res.GetResult()
    if ret != 0 {
      logger.ERR("result is %d, error:%s", ret, terror.GetErrMsg(ret))
      continue
    }

    for i := 0; i < res.GetRecordCount(); i++ {
      record, err := res.FetchRecord()
      if err != nil {
        logger.ERR("FetchRecord error:%s", err)
        continue
      }

      newMsg := &tcaplusservice.TbOnlineList{}
      err = record.GetPBData(newMsg)
      if err != nil {
        logger.ERR("GetPBData failed %s", err.Error())
        return
      }

      fmt.Println(tools.ConvertToJson(newMsg))
    }
  }
}

4.2 异步调用示例(推荐)

异步发送可以使用较少的协程实现较大的并发,编码相对复杂,用户及时处理响应占用内存少示例目录

package main

import (
  "fmt"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/example/PB/table/tcaplusservice"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/example/PB/tools"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/logger"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/response"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/terror"
  "git.woa.com/gcloud_storage_group/tcaplus-go-api/traverser"
  "time"
)

// 针对同一个表只能存在一个遍历器
// 同步请求的遍历只针对数据量较小的表,由于会把所有的数据存放在内存中,占用内存
// 数据量较大的表可以使用异步遍历,边遍历边处理数据
func ListTraverseExample() {
  // 创建异步协程接收请求
  respChan := make(chan response.TcaplusResponse)
  go func() {
    for {
      // resp err 均为 nil 说明响应池中没有任何响应
      resp, err := client.RecvResponse()
      if err != nil {
        logger.ERR("RecvResponse error:%s", err)
        continue
      } else if resp == nil {
        time.Sleep(time.Microsecond * 5)
        continue
      }
      // 同步异步 id 找到对应的响应
      if resp.GetAsyncId() == 12345 {
        respChan <- resp
      }
    }
  }()

  // 获取遍历器,遍历器最多同时8个工作,如果超过会返回nil
  tra := client.GetListTraverser(tools.Zone, "tb_online_list")
  if tra == nil {
    logger.ERR("GetTraverser fail")
    return
  }
  // 调用stop才能释放资源,防止获取遍历器失败
  defer tra.Stop()

  // (非必须)设置 异步 id
  tra.SetAsyncId(12345)

  // (非必须)限制本次遍历记录条数,默认不限制
  tra.SetLimit(1000)

  // 发送请求
  err := tra.Start()
  if err != nil {
    logger.ERR("SendRequest error:%s", err)
    return
  }

  for {
    timeOutChan := time.After(5 * time.Second)
    select {
    case <-timeOutChan:
      if tra.State() == traverser.TraverseStateNormal {
        fmt.Println("continue ......")
      } else if tra.State() == traverser.TraverseStateIdle {
        fmt.Println("traverse finish")
        return
      } else {
        fmt.Println("traverse stat err ", tra.State())
        return
      }
    // 等待收取响应
    case resp := <-respChan:
      // 获取响应结果
      errCode := resp.GetResult()
      if errCode != terror.GEN_ERR_SUC {
        logger.ERR("insert error:%s", terror.GetErrMsg(errCode))
        return
      }

      // 如果有返回记录则用以下接口进行获取
      for i := 0; i < resp.GetRecordCount(); i++ {
        record, err := resp.FetchRecord()
        if err != nil {
          logger.ERR("FetchRecord failed %s", err.Error())
          return
        }

        newMsg := &tcaplusservice.TbOnlineList{}
        err = record.GetPBData(newMsg)
        if err != nil {
          logger.ERR("GetPBData failed %s", err.Error())
          return
        }

        fmt.Println(tools.ConvertToJson(newMsg))
      }
    }
  }
}

5. 请求对象(request)中的方法说明

注:此处未列出请求对象的其它方法,即表示该方法在查询数据的场景不需要使用,误用可能会导致报错

/**
@brief  向请求中添加一条记录。
@param [IN] index         用于List操作,通常>=0,表示该Record在所属List中的Index;
      用于List表中的TCAPLUS_API_LIST_ADDAFTER_REQ,TCAPLUS_API_LIST_ADDAFTER_BATCH_REQ, index可以取值TCAPLUS_API_LIST_PRE_FIRST_INDEX或TCAPLUS_API_LIST_LAST_INDEX命令号。
      index是辅助key,tcaplus会自动维护其唯一性,新插入的记录index会往上自增。
      当cmd是TCAPLUS_API_LIST_ADDAFTER_REQ时,表示记录插入在该index所在的记录之后(隐含约束:index对应的记录必须已存在);
      此时index还支持以下特殊值:
                  TCAPLUS_API_LIST_PRE_FIRST_INDEX(-2):新元素插入在第一个元素之前
                 TCAPLUS_API_LIST_LAST_INDEX(-1):新元素插入在最后一个元素之后
      对于Generic操作,index无意义将被忽略。
@retval record.Record     返回记录指针
@retval error               错误码
**/
AddRecord(index int32) (*record.Record, error)

/**
@brief  设置请求的异步事务ID,api会将其值不变地通过对应的响应消息带回来
@param  [IN] asyncId  请求对应的异步事务ID
**/
SetAsyncId(id uint64)

/**
@brief  设置请求的通用标志位,可以通过"按位或"操作同时设定多个值
@param  [IN]  flag. 请求标志位的值
@retval 0     设置成功
@retval <0    失败,返回对应的错误码。通常因为未初始化。
@note   有效的标志位包括:
*  TCAPLUS_FLAG_FETCH_ONLY_IF_MODIFIED:
*       "数据变更才取回"标志位。在发起读操作之前,用户代码通过 TcaplusServiceRecord::SetVersion()
*       带上本地缓存数据的版本号,并将此标志置位,那么存储端检测到当前数据与API本地缓存的数据版本
*       一致时,表明该记录未发生过修改,API缓存的数据是最新的,因此在响应中将不会携带实际的数据,
*       只是返回 TcapErrCode::COMMON_INFO_DATA_NOT_MODIFIED 的错误码
*
*       在请求中设置了此标志位之后,收到响应后应首先通过 TcaplusServiceResponse::GetFlags() 来获知
*       发送请求时是否设置了TCAPLUS_FLAG_FETCH_ONLY_IF_MODIFIED标志.
*
*       只有如下请求支持设置此标志:
*           TCAPLUS_API_GET_REQ,
*           TCAPLUS_API_LIST_GET_REQ,
*           TCAPLUS_API_LIST_GETALL_REQ
*
*  TCAPLUS_FLAG_FETCH_ONLY_IF_EXPIRED:
*       "数据过期才取回"标志位。在发起读操作之前,用户代码通过 SetExpireTime() 设定数据过期时间,
*       并将此标志置位,那么存储端若检测到记录在指定时间内发生过更新,则将数据返回,
*       否则不返回实际数据,只是返回 TcapErrCode::COMMON_INFO_DATA_NOT_MODIFIED 的错误码。
*
*       在请求中设置了此标志位之后,收到响应后应首先通过 TcaplusServiceResponse::GetFlags() 来获知
*       发送请求时是否设置了 TCAPLUS_FLAG_FETCH_ONLY_IF_EXPIRED 标志.
*
*       只有如下请求支持设置此标志:
*           TCAPLUS_API_BATCH_GET_REQ
*
*  TCAPLUS_FLAG_ONLY_READ_FROM_SLAVE
*       设置此标志后,读请求将会直接发送给Tcapsvr Slave 节点。
*       Tcapsvr Slave 通常比较空闲,设置此标志有助于充分利用Tcapsvr Slave 资源。
*
*       适用场景:
*                              对于数据实时性要求不高的读请求,
*                              包括generic表和list表的所有读请求以及batchget,遍历请求
*
*  TCAPLUS_FLAG_LIST_RESERVE_INDEX_HAVING_NO_ELEMENTS
*       设置此标志后,List表删除最后一个元素时需要保留index和version。
*       ListDelete ListDeleteBatch ListDeleteAll操作在删除list表最后一个元素时,
*          设置此标志在写入新的List记录时,版本号依次增长,不会被重置为1。
*
*       适用场景:
*                              业务需要确定某个表在删除最后一个元素时是否需要保留index和version
*                              主要涉及List表的使用体验
*
*/
SetFlags(flag int32) int

/**
  @brief  清理请求的通用标志位,可以通过"按位或"操作同时设定多个值
  @param  [IN]  flag. 请求标志位的值
  @retval 0     设置成功
  @retval <0    失败,返回对应的错误码。通常因为未初始化。
  @note   有效的标志位列表及详细解释请参考 SetFlags()
*/
ClearFlags(flag int32) int

/**
  @brief   获取请求的通用标志位
  @return  返回请求的通用标志位
  @note   有效的标志位列表及详细解释请参考 SetFlags()
*/
GetFlags() int32

/**
  @brief 设置需要查询或更新的Value字段名称列表,即部分Value字段查询和更新,可用于get、replace、update操作。
  @param [IN] valueNameList   需要查询或更新的字段名称列表
  @retval error                  错误码
  @note  在使用该函数设置字段名时,字段名只能包含value字段名,不能包含key字段名;对于数组类型的字段,
              refer字段和数组字段要同时设置或者同时不设置,否则容易数据错乱
**/
SetFieldNames(valueNameList []string) error

/**
@brief 设置用户缓存,响应消息将携带返回
@param [IN] userBuffer   用户缓存
@retval error               错误码
**/
SetUserBuff(userBuffer []byte) error

/**
  @brief  设置记录版本的检查类型,用于乐观锁
  @param [IN] type   版本检测类型,取值可以为:
                      CheckDataVersionAutoIncrease: 表示检测记录版本号,只有当record.SetVersion函数传入的参数
                          version的值>0,并且版本号与服务器端的版本号相同时,请求才会成功同时在服务器端该版本号会自增1;
                          如果record.SetVersion的version <=0,则仍然表示不关心版本号
                      NoCheckDataVersionOverwrite: 表示不检测记录版本号。
                          当record.SetVersion函数传入的参数version的值>0,覆盖服务端的版本号;
                          如果record.SetVersion的version <=0,则仍然表示不关心版本号
                       NoCheckDataVersionAutoIncrease: 表示不检测记录版本号,将服务器端的数据记录版本号自增1,
                          若服务器端新写入数据记录则新写入的数据记录的版本号为1
  @retval error      错误码
  @note 此函数适合Replace, Update操作
  **/
SetVersionPolicy(p uint8) error

/**
  @brief  设置响应标志。主要用于Generic表的insert、increase、replace、update、delete操作。
  @param  [IN] flag  请求标志:
                          0表示: 只需返回操作执行成功与否
                          1表示: 操作成功,响应返回与请求字段一致
                          2表示: 操作成功,响应返回变更记录的所有字段最新数据
                          3表示: 操作成功,响应返回变更记录的所有字段旧数据
  @retval error      错误码
  NOTE:SetResultFlag有历史包袱,某些场景并不准确,推荐使用SetResultFlagForSuccess
  **/
SetResultFlag(flag int) error

/**
      @brief    设置响应标志。主要是本次请求成功执行后返回给前端的数据

      result_flag 的取值范围如下:

   TCaplusValueFlag_NOVALUE = 0,              // 不返回任何返回值
   TCaplusValueFlag_SAMEWITHREQUEST = 1,      // 返回同请求一致的值
   TCaplusValueFlag_ALLVALUE = 2,           // 返回tcapsvr端操作后所有字段的值
   TCaplusValueFlag_ALLOLDVALUE = 3,          // 返回tcapsvr端操作前所有字段的值


  下面是各个支持的命令字在设置不同的result_flag下执行成功后返回给API端的数据详细情况:

   1. TCAPLUS_API_INSERT_REQ TCAPLUS_API_BATCH_INSERT_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回本次insert操作后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回空数据

   2. TCAPLUS_API_REPLACE_REQ TCAPLUS_API_BATCH_REPLACE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回本次replace操作后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据, 如果tcapsvr端没有数据,即返回为空

   3. TCAPLUS_API_UPDATE_REQ TCAPLUS_API_BATCH_UPDATE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回本次update操作后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据

   4. TCAPLUS_API_INCREASE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回本次increase操作后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据, 如果tcapsvr端没有数据,即返回为空

   5. TCAPLUS_API_DELETE_REQ TCAPLUS_API_BATCH_DELETE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回空数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据

   6. TCAPLUS_API_LIST_DELETE_BATCH_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据, 暂时没有实现
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据, 凡是本次成功删除的index对应的数据都会返回

   7. TCAPLUS_API_LIST_ADDAFTER_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据, 暂时没有实现
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后, 返回本次插入的记录和本次淘汰的数据记录
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后不返回数据

   8. TCAPLUS_API_LIST_DELETE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据, 暂时没有实现
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回空数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端listdelete前的数据

   9. TCAPLUS_API_LIST_REPLACE_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 则操作成功后不返回数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据, 暂时没有实现
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回tcapsvr端listreplace后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端listreplace前的数据
  10. TCAPLUS_API_LIST_REPLACE_BATCH_REQ
       如果设置的是TCaplusValueFlag_NOVALUE, 操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作成功后返回和请求一致的数据
       如果设置的是TCaplusValueFlag_ALLVALUE, 则操作成功后返回tcapsvr端listreplace后的数据
       如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端listreplace前的数据

   @param  [IN] result_flag  请求标志:
                               0表示: 只需返回操作执行成功与否
                               1表示: 返回与请求字段一致
                               2表示: 须返回变更记录的所有字段最新数据
                               3表示: 须返回变更记录的所有字段旧数据


                               从而知道是哪个key对应的记录失败了
   @retval 0      设置成功
   @retval <0   失败,返回对应的错误码。通常因为未初始化。

*/
SetResultFlagForSuccess(result_flag byte) int

/**
      @brief    设置响应标志。主要是本次请求执行失败后返回给前端的数据

      result_flag 的取值范围如下:

      TCaplusValueFlag_NOVALUE = 0,             // 不返回任何返回值
      TCaplusValueFlag_SAMEWITHREQUEST = 1,     // 返回同请求一致的值
      TCaplusValueFlag_ALLVALUE = 2,             // 返回tcapsvr端操作后所有字段的值
      TCaplusValueFlag_ALLOLDVALUE = 3,         // 返回tcapsvr端操作前所有字段的值


     下面是各个支持的命令字在设置不同的result_flag下执行失败后返回给API端的数据详细情况:

      1. TCAPLUS_API_INSERT_REQ  TCAPLUS_API_BATCH_INSERT_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      2. TCAPLUS_API_REPLACE_REQ  TCAPLUS_API_BATCH_REPLACE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      3. TCAPLUS_API_UPDATE_REQ  TCAPLUS_API_BATCH_UPDATE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      4. TCAPLUS_API_INCREASE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      5. TCAPLUS_API_DELETE_REQ TCAPLUS_API_BATCH_DELETE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      6. TCAPLUS_API_LIST_DELETE_BATCH_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据, 暂时没有实现
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 则操作成功后返回tcapsvr端操作前的数据, 凡是本次成功删除的index对应的数据都会返回

      7. TCAPLUS_API_LIST_ADDAFTER_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据, 暂时没有实现
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 不返回数据

      8. TCAPLUS_API_LIST_DELETE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据, 暂时没有实现
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      9. TCAPLUS_API_LIST_REPLACE_REQ
          如果设置的是TCaplusValueFlag_NOVALUE, 则操作失败后不返回数据
          如果设置的是TCaplusValueFlag_SAMEWITHREQUEST, 则操作失败后返回和请求一致的数据, 暂时没有实现
          如果设置的是TCaplusValueFlag_ALLVALUE, 不合理场景
          如果设置的是TCaplusValueFlag_ALLOLDVALUE, 如果获取到了tcapsvr端的数据则返回tcpasvr端的数据,如果没有获取到tcapsvr端的数据则返回空

      @param    [IN] result_flag  请求标志:
                                  0表示: 只需返回操作执行成功与否
                                  1表示: 返回与请求字段一致
                                  2表示: 须返回变更记录的所有字段最新数据
                                  3表示: 须返回变更记录的所有字段旧数据

                                  对于batch_get请求,该字段设置为大于0时,某个key查询记录不存在或svr端产生的其它错误时会返回对应的key,
                                  从而知道是哪个key对应的记录失败了
      @retval 0     设置成功
      @retval <0     失败,返回对应的错误码。通常因为未初始化。

*/
SetResultFlagForFail(result_flag byte) int

/**
  @brief  设置LIST满时,插入元素时,删除旧元素的模式
  @param  [in] chListShiftFlag
            TCAPLUS_LIST_SHIFT_NONE: 不允许删除元素,若LIST满,插入失败;
            TCAPLUS_LIST_SHIFT_HEAD: 移除最前面的元素;
            TCAPLUS_LIST_SHIFT_TAIL: 移除最后面的元素
          如果表是排序List,必须要进行淘汰,且淘汰规则是根据字段的排序顺序进行自动制定的,用户调用该接口会失败
  @retval 0              设置成功
  @retval 非0            设置失败,具体错误参见 \link ErrorCode \endlink
*/
SetListShiftFlag(shiftFlag byte) int32

/**
    @brief  添加LIST记录的元素索引值。该函数只对于
                    TCAPLUS_API_LIST_DELETE_BATCH_REQ
                    TCAPLUS_API_LIST_GET_BATCH_REQ
                    有效,对于其它Command是无效的。
    @param  [in] idx          LIST元素索引值。不可取值TCAPLUS_API_LIST_PRE_FIRST_INDEX,不可取值TCAPLUS_API_LIST_LAST_INDEX。
    @retval 0                 设置成功
    @retval 非0               设置失败,具体错误参见 \link ErrorCode \endlink
*/
AddElementIndex(idx int32) int32

6. 响应对象(response)中的方法说明

注:此处未列出的响应对象的其它方法,即表示该方法在查询数据的场景不需要使用,误用可能会导致报错

/*
    @brief  获取响应结果
    @retval int tcaplus api自定义错误码。 0,表示请求成功;非0,有错误码,可从terror.GetErrMsg(int)得到错误消息
*/
GetResult() int

/*
    @brief  获取响应表名
    @retval string 响应消息对应的表名称
*/
GetTableName() string

/*
    @brief  获取响应appId
    @retval uint64 响应消息对应的appId
*/
GetAppId() uint64

/*
    @brief  获取响应zoneId
    @retval uint32 响应消息对应的zoneId
*/
GetZoneId() uint32

/*
    @brief  获取响应命令
    @retval int 响应消息命令字,cmd包中的响应命令字
*/
GetCmd() int

/*
    @brief  获取响应异步id,和请求对应
    @retval uint64 响应消息对应的异步id和请求对应
*/
GetAsyncId() uint64

/*
    @brief  获取本响应中结果记录条数
    @retval int 响应中结果记录条数
*/
GetRecordCount() int

/*
    @brief  从结果中获取一条记录
    @retval *record.Record 记录指针
    @retval error 错误码
*/
FetchRecord() (*record.Record, error)

/*
    @brief  获取响应消息中的用户缓存信息
    @retval []byte 用户缓存二进制,和请求消息中的buffer内容一致
*/
GetUserBuffer() []byte

7. 记录对象(record)中的方法说明

注:此处未列出的响应对象的其它方法,即表示该方法在查询数据的场景不需要使用,误用可能会导致报错

  • record的通用方法:
/**
    @brief  获取记录版本号
    @retval 记录版本号
    @note 对于Generic操作表示获取Record的版本;对于List操作表示获取Record所在List的版本。
**/
func (r *Record) GetVersion() int32

/**
      @brief  设置记录版本号
      @param [IN] v     数据记录的版本号:  <=0 表示不关注版本号不关心版本号。具体含义如下。
                  当CHECKDATAVERSION_AUTOINCREASE时: 表示检测记录版本号。
                      如果Version的值<=0,则仍然表示不关心版本号不关注版本号;
                      如果Version的值>0,那么只有当该版本号与服务器端的版本号相同时,
                      Replace, Update, Increase, ListAddAfter, ListDelete, ListReplace, ListDeleteBatch操作才会成功同时在服务器端该版本号会自增1。
                  当NOCHECKDATAVERSION_OVERWRITE时: 表示不检测记录版本号。
                      如果Version的值<=0,则会把版本号1写入服务端的数据记录版本号(服务器端成功写入的数据记录的版本号最少为1);
                      如果Version的值>0,那么会把该版本号写入服务端的数据记录版本号。
                  当NOCHECKDATAVERSION_AUTOINCREASE时: 表示不检测记录版本号,将服务器端的数据记录版本号自增1,若服务器端新写入数据记录则新写入的数据记录的版本号为1。
  **/
func (r *Record) SetVersion(v int32)

/**
  @brief  基于 PB Message 设置record数据
  @param [IN] data  PB Message
  @retval []byte 记录的keybuf,用来唯一确定一条记录,多用于请求与响应记录相对应
  @retval error     错误码
*/
func (r *Record) SetPBData(message proto.Message) ([]byte, error)

/**
    @brief  基于 PB Message 读取record数据
    @param [IN] data   PB Message
    @retval []byte 记录的keybuf,用来唯一确定一条记录,多用于请求与响应记录相对应
    @retval error      错误码
**/
func (r *Record) GetPBData(message proto.Message) error

/**
    @brief 设置部分value字段,专用于field操作,TcaplusApiPBFieldGetReq TcaplusApiPBFieldUpdateReq TcaplusApiPBFieldIncreaseReq
    @param [IN] msg proto.Message 由proto文件生成的记录结构体
    @param [IN] values []string 指定本次设置的 value 字段
    @retval []byte 由记录key字段编码生成,由于多条记录的响应记录是无序的,可以用这个值来匹配记录
    @retval error 错误码
**/
func (r *Record) SetPBFieldValues(message proto.Message, values []string) ([]byte, error)

/**
    @brief 设置部分key字段,专用于partkey操作,TcaplusApiGetByPartkeyReq
    @param [IN] msg proto.Message 由proto文件生成的记录结构体
    @param [IN] keys []string 指定本次设置的 key 字段
    @retval []byte 由记录key字段编码生成,由于多条记录的响应记录是无序的,可以用这个值来匹配记录
    @retval error 错误码
**/
func (r *Record) SetPBPartKeys(message proto.Message, keys []string) ([]byte, error)

8. 常见问题

详见错误码含义和处理方法

8. 其它参考文档

[PB List表][C++ SDK]遍历表数据接口说明

[PB List表][RESTFul API]遍历表接口说明

results matching ""

    No results matching ""